package openjdk.collections;

import java.util.*;

/**
 * Created by boot on 1/13/16.
 */
public class TestMap {

    public static void init(Map map) {
        if (null != map) {
            String key = null;
            for (int i = 5; i > 0; i--) {
                key = new Integer(i).toString() + " .0";
                map.put(key, key.toString());
                // Map 中的key 是不重复的，如果存入多个相同的key
                // 则后插入的记录值会 前一次的记录
                map.put(key, key.toString() + "0");
            }


        }
    }

    public static void output(Map map) {
        if (null != map) {
            Object key = null;
            Object value = null;
            // 使用迭代器遍历Map 的键，根据键取值
            Iterator it = map.keySet().iterator();
            while (it.hasNext()) {
                key = it.next();
                value = map.get(key);
                System.out.println("Key:" + key + " ; value: " + value);
            }

            System.out.println("==== 以下是使用迭代遍历Map.Entry输出Key 和 Value ====");
            // 或者使用迭代器遍历Map的记录Map.Entry
            Map.Entry entry = null;
            it = map.entrySet().iterator();
            while (it.hasNext()) {
                // 一个Map.Entry 代表一条记录
                entry = (Map.Entry) it.next();
                // 通过Entry 可以获得记录的键和值
                System.out.println("Key: " + entry.getKey() + " ; value: " + entry.getValue());
            }
        }
    }

    public static boolean containsKey(Map map, Object key) {
        if (null != map) {
            return map.containsKey(key);
        }
        return false;
    }


    public static boolean containsValue(Map map, Object val) {
        if (null != map) {
            return map.containsValue(val);
        }
        return false;
    }


    /**
     * HashMap 的key 和 Value 都可以是null
     */
    public static final void testHashMap() {
        Map hMap = new HashMap();
        init(hMap);
        // HashMap 的键可以为null
        hMap.put(null, "ddd");
        // HashMap 的值可以为null
        hMap.put("aaa", null);
        output(hMap);
    }

    /**
     * Hashtable 的Key 和 Value 都不能是null
     */
    public static final void testHashtable() {
        Map ht = new Hashtable();
        init(ht);
        // Hashtable's key must not null
        //ht.put(null,"ddd");
        // Hashtable's value must not null
        // ht.put("aaa",null);

        output(ht);
    }

    /**
     * LinkedHashMapDemo 的Key 和 Value 都可以为null
     */
    public static final void testLinkedHashMap() {
        Map lhm = new LinkedHashMap();
        init(lhm);
        // LinkedHashMapDemo 的键可以为null
        lhm.put(null, "ddd");
        lhm.put(null, "aaa");
        // LinkedHashMapDemo 的值可以为null
        lhm.put("aaa", null);
        output(lhm);
    }


    /**
     * TreeMap 的Key 不能为null 而Value 可以为null
     */
    public static final void testTreeMap() {
        Map tMap = new TreeMap();
        init(tMap);
        // TreeMap的键不能为null
        //tMap.put(null,"ddd");
        // TreeMap的值不能为null
        tMap.put("aaa", null);
        output(tMap);
    }


    public static void main(String[] args) {
        System.out.println("测试HashMap");
        TestMap.testHashMap();
        System.out.println("========================");
        System.out.println("测试Hashtable");
        TestMap.testHashtable();
        System.out.println("测试LinkedHashMap");
        TestMap.testLinkedHashMap();
        System.out.println("测试TreeMap");
        TestMap.testTreeMap();

        Map hMap = new HashMap();
        TestMap.init(hMap);
        System.out.println("初始化一个新的HashMap : hmap");
        TestMap.output(hMap);

        // 清空Map
        hMap.clear();
        System.out.println("将Map clear 后，Map 空了么？ " + hMap.isEmpty());

        TestMap.output(hMap);

        // 重新加入新的记录
        System.out.println("重新加入aaa 和 bbb 记录");
        hMap.put("aaa", "aaaa");
        hMap.put("bbb", "bbbb");

        // 判断是否包含某个键或值
        System.out.println("Map 包含键aaa? " + TestMap.containsKey(hMap, "aaa"));
        System.out.println("Map 包含值aaaa? " + TestMap.containsValue(hMap, "aaaa"));

        // 根据键删除Map 中的记录
        hMap.remove("aaa");
        System.out.println("删除aaa后，Map包含aaa? " + TestMap.containsKey(hMap, "aaa"));
        // 获取Map 中的记录
        System.out.println("Map 中的记录数为：" + hMap.size());
    }


}
